/*
	Exemplos para compreendimento da função: bind
	Não tem o foco de compilação
*/

//	cabeçalhos:
#include <sys/types.h>
#include <sys/socket.h>

//	protótipo:
int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
                
//	explicação :
/*
	[Usaremos no servidor]
	Usado para associar um socket a uma porta, chamar esta função antes da chamada
	para a função 'listen'
	Parâmetros:
	- sofckfd:	file descriptor retornado pela função socket()
	- my_addr:	ponteiro para uma estrutura sockaddr que contém informações sobre
				o endereço (no servidor utilizar o IP local).
				Obs.: No servidor, passar para o registro 'hints' ai_flags = AI_PASSIVE
	- addrlen:	tamanho em bytes do endereço (my_addr) - utilizar sizeof(struct sockaddr)
	
	Retorna: -1 em caso de erro.
*/


// exemplo:
struct addrinfo hints, *res;
int sockfd;

// limpa a variável hints
memset(&hints, 0, sizeof hints);

hints.ai_family = AF_UNSPEC;		// não especificado: ipv4 ou ipv6
hints.ai_socktype = SOCK_STREAM;	// TCP
hints.ai_flags = AI_PASSIVE;		// IP local

// preenche a variável *res, passando a porta 3490 por parâmetro
getaddrinfo(NULL, "3490", &hints, &res);

// cria um socket
sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);

// Caso a porta já esteja em uso, solicita o reuso da mesma,
// para evitar a mensagem de erro: "Address already in use"
if (setsockopt(listener,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) {
    perror("setsockopt");
    exit(1);
} 

// solicita o bind para o SO
if( bind(sockfd, res->ai_addr, res->ai_addrlen) == -1) {
	fprintf(stderr, "Erro ao efetuar o bind!");
	exit(EXIT_FAILURE);
}

// ... CONTINUA O CÓDIGO
	
	
	
	
	
